import express from "express"
import cors from "cors"
import fs from "fs"
import crypto from "node:crypto"

const app = express()
app.use(cors())
app.use(express.json())

// 强缓存 Expires
app.get('/api',(req,res)=>{
    // 缓存期限：一般设置过期时间
    res.setHeader("Expires",new Date("2024-4-18 21:03").toUTCString())
    res.send({
        msg:"Hello World"
    })
})

// 强缓存 Cache-Control 注意：Cache-Control比Expires优先级高
app.get('/api1',(req,res)=>{
    // 设置过期时间（秒） 
    // public 表示可以被任何缓存所缓存
    // private 表示只能被浏览器缓存
    // no-cache 表示必须先与服务器确认返回的响应是否被更改，如果未被更改，则使用缓存
    // max-age 表示缓存时间
    res.setHeader("Cache-Control", "public, max-age=10")
    res.send({
        msg:"Hello World"
    })
})

// 协商缓存（Last-Modified 文件修改最后时间判断） 注意走协商缓存时候要关闭强缓存，因为强缓存优先级比协商缓存高
// 获取文件最后修改时间
function isFresh(){
    return fs.statSync("./index.js").mtime.toUTCString()
}

app.get("/api2",(req,res)=>{
    // 关闭强缓存
    res.setHeader("Cache-Control", "no-cache")
    // 获取浏览器的文件修改时间
    const ifModifiedSince = req.headers["if-modified-since"]
     // 设置协商缓存（文件修改时间）
    res.setHeader("Last-Modified",isFresh())
    // 判断浏览器文件修改时间和服务器的文件修改时间是否一致
    if(ifModifiedSince == isFresh()){
        console.log("有缓存");
        res.statusCode = 304
        res.end()
        return
    }
    console.log("没有缓存");
    res.send({
        msg:"协商缓存"
    })
})

// 协商缓存（ETag 文件内容判断） 注意走协商缓存时候要关闭强缓存，因为强缓存优先级比协商缓存高
// 获取文件内容最后修改时间
function isFresh1(){
    return crypto.createHash("sha256").update(fs.readFileSync("./index.js")).digest("hex")
}

app.get("/api3",(req,res)=>{
    res.setHeader("Cache-Control","no-cache")
    const ifNoneMatch = req.headers["if-none-match"]
    res.setHeader("ETag",isFresh1())
    if(ifNoneMatch == isFresh1()){
        console.log("有缓存");
        res.statusCode = 304
        res.end()
        return;
    }
    console.log("没有缓存");
    res.send({
        msg:"协商缓存"
    })
})


app.listen(3000, () => {
    console.log("Server is running on port 3000");
})